package com.zpark.ann;


import com.zpark.beans.Student;
import com.zpark.beans.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;


/*
    可以使用此注解描述 Spring 中的 Bean，但它是一个泛化的概念，仅仅表示一个组件（Bean），
    并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可。属性：value，用于指定bean的id，
    当不写时，默认为当前类名，并且首字母小写
    相当于: <bean id="" class="" />
    <bean id="objClass" class="com.zpark.ann.ObjClass" />
 */
@Component
/*
    通常作用在控制层（如 Struts2 的 Action、SpringMVC 的 Controller），
    用于将控制层的类标识为 Spring 中的 Bean，其功能与 @Component 相同
    <bean id="objClass" class="com.zpark.ann.ObjClass" />
 */
@Controller
/*
    通常作用在业务层（Service 层），用于将业务层的类标识为 Spring 中的 Bean，其功能与 @Component 相同。
    <bean id="objClass" class="com.zpark.ann.ObjClass" />
 */
@Service
/*
    用于将数据访问层（DAO层）的类标识为 Spring 中的 Bean，其功能与 @Component 相同。
    <bean id="objClass" class="com.zpark.ann.ObjClass" />
 */
@Repository
/*
    作用是指定作用范围。属性：value，指定范围的取值，常用取值singleton（单例）、prototype（多例）
 */
@Scope("prototype")
public class ObjClass {

    /*
        可以应用到 Bean 的属性变量、属性的 setter 方法、非 setter 方法及构造函数等，
        配合对应的注解处理器完成 Bean 的自动配置工作。默认按照 Bean 的类型进行装配。
        <bean id="objClass" class="com.zpark.ann.ObjClass"  autowire="byType" />
     */
    @Autowired
    private User user;

    /*
        作用与 Autowired 相同，区别在于 @Autowired 默认按照 Bean 类型装配，而 @Resource 默认按照 Bean 实例名称进行装配。<br/>
        @Resource 中有两个重要属性：name 和 type。<br/>Spring 将 name 属性解析为 Bean 的实例名称，type 属性解析为 Bean
        的实例类型。如果指定 name 属性，则按实例名称进行装配；如果指定 type 属性，则按 Bean 类型进行装配。如果都不指定，则先按
        Bean 实例名称装配，如果不能匹配，则再按照 Bean 类型进行装配；如果都无法匹配，则抛出 NoSuchBeanDefinitionException 异常。
     */
    @Resource
    private Student student;

    @Value("大锤")
    private String uname;

    @Value("${user}")
    private String sex;

    /**
     * 用于指定初始化方法
     */
    @PostConstruct
    public void init(){

    }

    /*
        用于指定销毁方法
     */
    @PreDestroy
    public void des(){

    }

}
